#!/bin/bash
# Pavadinimas   : dmd5 (deep-md5sum)
# Autorius      : Narunas Krasauskas
# S/N           : 1.4
# Laikas        : 2013/09/01
# Paskirtis     : Scenarijus skirtas skaiciuoti failu autentifikavimo
##              ataskaitas aplanku hierarchijos medziams arba atskiriems
##              failams.
# Naudojimas    : dmd -h
# Copyright: GPLv3

## Pagrindiniai kintamieji
_check=0
_help=0
_verbose=0
_input=
_output=

## Programos parinkciu sarasas
_parinktys=i:o:chv

while getopts $_parinktys _opt
do
    case $_opt in
        i) _input=$OPTARG ;;
        c) _check=$(( $_check + 1 )) ;;
        h) _help=$(( $_help + 1 )) ;;
        o) _output=$OPTARG ;;
        v) _verbose=$(( $_verbose + 1 )) ;;
        *) exit 1 ;;
    esac
done

## Remove options from the command line
## $OPTIND points to the next, unparsed argument
shift "$(( $OPTIND - 1 ))"

## Papasakojam vartotojui, ko tiketis.
if [ "$_help" -ne 0 ]; then
	echo "dmd5 { [-c | -h | -v] -i aplankas -o aplankas }"
	echo "  -i 'ivesties failas|aplankas'"
	echo "  -o 'isvesties failas|aplankas'"
	echo "dmd5 -vi 'kazkoks/aplankas' -o 'isvesties/aplankas/ir/ataskaita.md5'"
	echo "dmd5 -vci 'patikros/failas/yra/ataskaita.md5' -o './patikrinta.ck'"
	exit 0
fi

#### Funkcijos

## Taikinys: aplankas arba failas
function ctrl_in()
{
	if [ -n "$_input" -a -e "$_input" ]; then
		_input="$(readlink -e "$_input")"
		_taikinys="$(basename "$_input")"
	    ## Kontroliuojam ataskaitu irasus
        if [ -d "$_input" ]; then # Jei nustatyta tikrinti aplanka
            if [ "$_input" == "$(pwd)" -o "$_input" == "." -o "$_input" == "./" ]; then
                _keitinys=
            else
                _keitinys="$_taikinys/"
            fi
        else # Jei nustatyta tikrinti faila
            _keitinys="$_taikinys"
	    fi
	else
		echo 'Netinkamai nurodytas ivesties failas ar aplankas:'
		echo ' * parinktis -i'
		exit 2
	fi
}
## Kontroliuojam isvesties faila
function ctrl_out() {
	ctrl_in;
	# -o ? -o = d -c 0
	if [ -n "$_output" -a -d "$_output" -a "$_check" -eq 0 ]; then
		_output="$_output/$_taikinys".md5
	# -o ? -c 0
	elif [ -n "$_output" -a "$_check" -eq 0 ]; then
		: # Paliekam parinkta adresa
	# -o ? -o = d -c ?
	elif [ -n "$_output" -a -d "$_output" -a "$_check" -ne 0 ]; then
		_output="$(echo $_output/$_taikinys | sed 's|.md5$||')".ck
	# -o 0 -c ?
	elif [ -z "$_output" -a "$_check" -ne 0 ]; then
		_output="$(echo $_taikinys | sed 's|.md5$||')".ck
	# -o 0 -c 0
	elif [ -z "$_output" -a "$_check" -eq 0 ]; then
		_output="$_taikinys".md5
	else
		echo 'Netinkamai nurodytas isvesties failas ar aplankas:'
		echo ' * parinktis -o'
		exit 2
	fi
	touch "$_output"
	if [ "$?" -ne 0 ]; then
		echo 'Neturi teises rasyti nurodytu adresu:'
		echo $_output
		exit 3
	fi
}
## Sukuriam ataskaitu faila aplankui ar failui
function mk_sums()
{
	ctrl_out;
	printf "# md5sum aplankui ar failui: \"%s\"\n#\n" "$_taikinys" | tee "$_output" | sed 's|#$||'
	case $_verbose in
		0) ## Kai verbose NEijungtas
		find "$_input" -depth -not -samefile "$_output" -type f -print0 | xargs --null -l md5sum -b | sed -e "s|$_input/\?|$_keitinys|" >> "$_output"
		;;
		*) ## Kai verbose ijungtas
		find "$_input" -depth -not -samefile "$_output" -type f -print0 | xargs --null -l echo | while read i; do md5=$(md5sum -b "$i"); md5=$(echo "$md5" | sed -e "s|$_input/\?|$_keitinys|"); echo "$md5" | tee -a "$_output"; done
		;;
	esac
	echo -e \\n'Sukurti failai:'
	echo "'$_output'"
}
## Tikrinam atskaitu faila
function ck_sums()
{
	ctrl_out;
	case $_verbose in
		0) ## Kai verbose NEijungtas
		md5sum -c "$_input" > "$_output"
		;;
		*) ## Kai verbose ijungtas
		md5sum -c "$_input" | tee "$_output"
		;;
	esac
	echo -e \\n'Sukurti failai:'
	echo "'$_output'"
}

####< Funkcijos

## Galimi tik 2 veikimo scenarijai:
## * Kuriamos failu autentifikavimo ataskaitos
## * Arba tikrinami failai

## Jei pasirinktas ataskaitu rezimas
if [ "$_check" -eq 0 ]; then
	mk_sums;
## Jei pasirinkta tikrinti failus
else
	ck_sums;
fi

## Pridedam zinute, kad darbas baigtas
printf %15s | tr " " "*"
printf "\nDarbas baigtas! :)\n"
